<?php
class Delivery_Model_Mapper_OpcionesFamiliasProductos
	extends Delivery_Model_Mapper_Abstract
{
	
	public function getDbTable()
	{
		return parent::getDbTable( 'OpcionesFamiliasProductos' );
	}
	
	public function save( $familiaProducto )
	{
		$dbTable= $this->getDbTAble();
		
		if ( ! $familiaProducto->getId() ){	
			return $familiaProducto->idOpcionFamiliaProducto = $dbTable->insert( $familiaProducto );
		} else {					
			return $dbTable->update( $familiaProducto );	
		}	
	}
	
    public function delete( $opcionFamiliaProducto )
	{
		$dbTable= $this->getDbTAble();
		
		return $dbTable->delete( $opcionFamiliaProducto );	
	}
	
	/**
	 * @param int $idCategoria
	 * @return object Delivery_Model_Categoria
	 */
	public function getById( $idFamilia ){
	
		if ( $this->getIdentityMap()->isRegistered( 'Delivery_Model_OpcionFamilia', $idFamilia )){
			return $this->getIdentityMap()->get( 'Delivery_Model_OpcionFamilia', $idFamilia );
		}
		
		$dbTable= $this->getDbTAble();
		$row	= $dbTable->getById( $idFamilia );
	
		if( empty($row) ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::OPCION_FAMILY_NOT_FOUND );
		}
		
		return $this->_fetch( $row );
	}
	
	/**
	 * @param array ids
	 *  @return Delivery_Model_Collection_Categorias
	 */
	public function getByIds( $ids )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'OpcionesFamiliasProductos',
			$dbTable->getByIds( $ids )
		);
	}
	
	public function getByProducto( $idProducto )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'OpcionesFamiliasProductos',
			$dbTable->getByProducto( $idProducto )
		);
	}
	
    public function loadFamilia( $opciones )
	{
		$mapper = Delivery_Model_Factory::mapper('OpcionesFamilias');
		
		if (  $opciones instanceof Delivery_Model_Collection_OpcionesFamiliasProductos ){

			if (count( $opciones ) < 1){
				return;
			}
			
			$familias = $mapper->getByIds( $opciones->getKeyValues( 'idOpcionFamilia', true ) );
			
			foreach ( $opciones as $opcion){
				$opcion->setFamilia(
					$familias->offsetGet( $opcion->idOpcionFamilia )
				);
			}
		}
	 	elseif ( $opciones instanceof Delivery_Model_Opcion){
			
	 		$opciones->setFamilia(
	 			$mapper->getById( $opciones->idOpcionFamilia )
	 		);
		}
	}
	
	/**
	 * @return Delivery_Model_Collection_Categorias
	 */
	public function getAll(){
	
		$dbTable= $this->getDbTAble();
			
		return $this->_fetchCollection(
			'OpcionesFamiliasProductos',
			$dbTable->getAll()
		);
	}	
	
	/**
	 * @param array
	 * @return array objetos opcionesFamiliasProductos
	 */
	public function getByParams( $params, $offset = null, $limit = null, $order = null ){
		
		$dbTable = $this->getDbTAble();
			
		return $this->_fetchCollection(
			'OpcionesFamiliasProductos',
			$dbTable->getByParams( $params, $offset, $limit, $order )
		);
	}
	
	/**
	 * @param array
	 * @return int
	 */
	public function countByParams( $params ){
		return $this->getDbTAble()->countByParams($params);
	}
	
	
	/**
	 * @param array
	 * @return object Delivery_Model_Categoria
	 */
	protected function _fetch( $row )
	{
		$familia = new Delivery_Model_OpcionFamiliaProducto( $row );
		
		$this->getIdentityMap()->set( $familia, $familia->getId() );
		
		return $familia;
	}
	
}